package com.woniuxy.config;

import com.google.common.hash.BloomFilter;
import com.google.common.hash.Funnels;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.nio.charset.StandardCharsets;

/**
 * @program: bookstore
 * @description:
 * @create: 2024-10-11 17:57
 **/
@Configuration
public class BloomFilterConfig {

    @Bean
    public BloomFilter<String> bloomFilter() {
        // 创建一个布隆过滤器，假设预计插入 1000 个元素，假阳性概率为 0.01
        return BloomFilter.create(
                Funnels.stringFunnel(StandardCharsets.UTF_8), // 元素类型
                1000, // 预计插入元素数量
                0.01 // 假阳性概率
        );
    }
}
//    //用于存储布隆过滤器的位数组
//    private BitSet bitSet;
//    //数学公式的m
//    private int bitSize;
//    //数学公式的k
//    private int hashCount;
//
//
//    // 构造函数，初始化布隆过滤器
//    public BloomFilter() {
//        this.bitSize = 1000000; // 预设的bit位大小
//        this.hashCount = 3;      // 使用的哈希函数数量
//        this.bitSet = new BitSet(bitSize);
//    }
//
//    // 添加元素到布隆过滤器
//    public void add(String value) {
//        byte[] bytes = value.getBytes(StandardCharsets.UTF_8);
//        for (int i = 0; i < hashCount; i++) {
//            int hash = hash(bytes, i);
//            bitSet.set(Math.abs(hash % bitSize), true);
//        }
//    }
//
//    // 检查元素是否在布隆过滤器中
//    public boolean mightContain(String value) {
//        byte[] bytes = value.getBytes(StandardCharsets.UTF_8);
//        for (int i = 0; i < hashCount; i++) {
//            int hash = hash(bytes, i);
//            if (!bitSet.get(Math.abs(hash % bitSize))) {
//                return false;  // 如果有一个位置为 false，则说明该元素一定不存在
//            }
//        }
//        return true;  // 所有位置都为 true，则该元素可能存在
//    }
//
//    // 自定义简单的哈希函数，基于 MD5
//    private int hash(byte[] bytes, int seed) {
//        try {
//            MessageDigest md5 = MessageDigest.getInstance("MD5");
//            md5.update(bytes);
//            md5.update((byte) seed);
//            byte[] digest = md5.digest();
//            return Math.abs(digest[0]) + Math.abs(digest[1]); // 使用 MD5 前两个字节作为哈希值
//        } catch (Yi e) {
//            throw new RuntimeException(e);
//        }
//    }
// 配置布隆过滤器